
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import * as graphic from '../../util/graphic.js';
import { round } from '../../util/number.js';
import { isFunction } from 'zrender/lib/core/util.js';

function createGridClipPath(cartesian, hasAnimation, seriesModel, done, during) {
	var rect = cartesian.getArea();
	var x = rect.x;
	var y = rect.y;
	var width = rect.width;
	var height = rect.height;
	var lineWidth = seriesModel.get(['lineStyle', 'width']) || 2; // Expand the clip path a bit to avoid the border is clipped and looks thinner

	x -= lineWidth / 2;
	y -= lineWidth / 2;
	width += lineWidth;
	height += lineWidth; // fix: https://github.com/apache/incubator-echarts/issues/11369

	x = Math.floor(x);
	width = Math.round(width);
	var clipPath = new graphic.Rect({
		shape: {
			x: x,
			y: y,
			width: width,
			height: height
		}
	});

	if (hasAnimation) {
		var baseAxis = cartesian.getBaseAxis();
		var isHorizontal = baseAxis.isHorizontal();
		var isAxisInversed = baseAxis.inverse;

		if (isHorizontal) {
			if (isAxisInversed) {
				clipPath.shape.x += width;
			}

			clipPath.shape.width = 0;
		} else {
			if (!isAxisInversed) {
				clipPath.shape.y += height;
			}

			clipPath.shape.height = 0;
		}

		var duringCb = isFunction(during) ? function (percent) {
			during(percent, clipPath);
		} : null;
		graphic.initProps(clipPath, {
			shape: {
				width: width,
				height: height,
				x: x,
				y: y
			}
		}, seriesModel, null, done, duringCb);
	}

	return clipPath;
}

function createPolarClipPath(polar, hasAnimation, seriesModel) {
	var sectorArea = polar.getArea(); // Avoid float number rounding error for symbol on the edge of axis extent.

	var r0 = round(sectorArea.r0, 1);
	var r = round(sectorArea.r, 1);
	var clipPath = new graphic.Sector({
		shape: {
			cx: round(polar.cx, 1),
			cy: round(polar.cy, 1),
			r0: r0,
			r: r,
			startAngle: sectorArea.startAngle,
			endAngle: sectorArea.endAngle,
			clockwise: sectorArea.clockwise
		}
	});

	if (hasAnimation) {
		var isRadial = polar.getBaseAxis().dim === 'angle';

		if (isRadial) {
			clipPath.shape.endAngle = sectorArea.startAngle;
		} else {
			clipPath.shape.r = r0;
		}

		graphic.initProps(clipPath, {
			shape: {
				endAngle: sectorArea.endAngle,
				r: r
			}
		}, seriesModel);
	}

	return clipPath;
}

function createClipPath(coordSys, hasAnimation, seriesModel, done, during) {
	if (!coordSys) {
		return null;
	} else if (coordSys.type === 'polar') {
		return createPolarClipPath(coordSys, hasAnimation, seriesModel);
	} else if (coordSys.type === 'cartesian2d') {
		return createGridClipPath(coordSys, hasAnimation, seriesModel, done, during);
	}

	return null;
}

export { createGridClipPath, createPolarClipPath, createClipPath };